import config from './config/BaseUrl';
import './utils/extendApi'
import './utils/api'
// app.js
App({

  globalData: {
    baseUrl: config.baseUrl, // 你的基礎 URL
    webSocketUrl: config.webSocketUrl, //socketurl
    ws: null, //socket链接
    chatList: [], //用户好友表
    unreadCount: null,//总未读数
    messageListeners: [], // 存储普通消息监听器
    systemMessageListeners: [], // 存储系统消息监听器
    showMessagePopup: false, // 新增消息弹窗状态
    popupMessage: null, // 弹窗消息内容
    messageSoundUrl: config.messageSoundUrl, // 提示音路径
    messageAudioContext: null, // 预加载的音频上下文（初始化为 null）
    popupTimeout: null, // 存储当前弹窗的定时器 ID
    reconnectSocketCount:1, // socket重连次数
  },

  onLaunch() {
    console.log("小程序启动了！");
  },

  initChat(){
    console.log('初始化聊天方法执行！')
    if (!this.globalData.ws) {
    console.log('初始化socket方法执行！')
      this.initWebSocket();
    }
    if (this.globalData.ws && this.globalData.chatList.length == 0) {
      console.log('初始化chatList方法执行！')
      this.initChatList();
    }
    this.initMessageSound();
  },

  //初始化音频
  initMessageSound() {
    this.globalData.messageAudioContext = wx.createInnerAudioContext();
    this.globalData.messageAudioContext.src = this.globalData.messageSoundUrl;
    this.globalData.messageAudioContext.loop = false;
    this.globalData.messageAudioContext.onError((res) => {
      console.error('音频播放错误:', res.errMsg);
    });
  },

  //初始化聊天列表
  initChatList(callback) {
    wx.request({
      url: `${this.globalData.baseUrl}/api/user/message/msgUserList`,
      method: 'GET',
      data: {
        userId: wx.getStorageSync('userId')
      },

      success: (res) => {
        console.log("获取聊天列表数据！", res.data)
        this.globalData.chatList = res.data.data.msgUserList;
        let count = res.data.data.unreadCount;
        this.globalData.unreadCount = count;
        //渲染信息徽标
        if (count > 0) {
          wx.setTabBarBadge({
            index: 2, // tabBar索引（从0开始）
            text: count > 99 ? '99+' : count.toString()
          })
        } else {
          wx.removeTabBarBadge({
            index: 2
          })
        }


        // 调用回调函数
        if (typeof callback === "function") {
          callback();
        }
      },
      fail: (error) => {
        console.error('获取聊天集合失败:', error);
        if (callback) callback(); // 即使失败也调用回调
      },
    });
  },



  // 初始化 WebSocket
  initWebSocket() {
    const token = wx.getStorageSync('token');
    if (!token) return;

    const ws = wx.connectSocket({
      url: `${this.globalData.webSocketUrl}/ws?token=${token}&type=User`,
      header: {
        'content-type': 'application/json',
      },
      success: () => {
        console.log('WebSocket连接成功，开始建立通道！');
      },
      fail: (err) => {
        console.error('WebSocket连接失败', err);
      },
    });

    // 监听 WebSocket 打开事件
    wx.onSocketOpen(() => {
      console.log('WebSocket通道已建立');
    });

    // 监听 WebSocket 错误事件
    wx.onSocketError((err) => {
      console.error('WebSocket错误', err);
    });

    //监听 WebSocket 关闭事件
    wx.onSocketClose(() => {
      // 判断是否是主动关闭（退出登录时）
    if (!wx.getStorageSync('token')) { 
      console.log('WebSocket 因退出登录主动关闭，不触发重连');
      return;
    }
      if(this.globalData.reconnectSocketCount > 5){
        console.log('socket重连次数超过5次，停止重连！')
        return;
      }
      console.log(`WebSocket通道关闭，尝试第${this.globalData.reconnectSocketCount++}次重新连接...`);
      setTimeout(() => this.initWebSocket(), 3000); // 3秒后重连
    });

    // 监听消息并分发
    wx.onSocketMessage((res) => {
      const data = JSON.parse(res.data);
      this.handleSocketMessage(data);
    });

    // 存储 WebSocket 对象到全局
    this.globalData.ws = ws;
    console.log("ws:{}", ws)
  },

  // 处理 WebSocket 消息并分发
  handleSocketMessage(data) {
    const {
      senderId,
      content,
      time
    } = data;

    // 系统消息处理
    if (senderId === 'system') {
      console.log('收到系统消息:', data);
      // 系统消息处理
      this.globalData.systemMessageListeners.forEach((listener) => {
        listener(data);
      });
      return;
    }

    //不在聊天页面，更新全局未读计数
    const currentPage = getCurrentPages().pop();
    const isChatPage = currentPage &&
      currentPage.route === 'pages/message/chat/chat' &&
      currentPage.options.chatId === data.senderId;

    if (!isChatPage) {
      const chatList = this.globalData.chatList;
      // 遍历 chatList 找到对应的 receiverId 并更新 unread
      let updated = false; // 标记是否找到对应的好友
      for (let i = 0; i < chatList.length; i++) {
        if (chatList[i].receiverId == senderId) {
          chatList[i].unread += 1; // 更新未读计数
          chatList[i].lastMsg = content;
          chatList[i].time = this.formatTimestamp(time) || Date.now();
          updated = true;
          this.updateUnreadCount();
          this.showMessagePopup(chatList[i], content);
          break;
        }
        // 如果没有找到对应的好友  不会

        // 通知页面更新数据
        this.notifyPages();
      }
      return;
    }

    //在聊天页面
    console.log("收到用户消息{}", data)
    // 分发消息给用户监听器
    this.globalData.messageListeners.forEach((listener) => {
      listener(data);
    });
  },

  // 格式化时间戳为易读格式
  formatTimestamp(timestamp) {
    const date = new Date(timestamp);
    const now = new Date();

    // 获取当天、昨天和目标日期的年月日
    const today = new Date(now.getFullYear(), now.getMonth(), now.getDate());
    const yesterday = new Date(today);
    yesterday.setDate(today.getDate() - 1);

    const targetDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());

    // 判断是否是今天
    if (targetDate.getTime() === today.getTime()) {
      return `${this.formatTime(date)}`;
    }

    // 判断是否是昨天
    if (targetDate.getTime() === yesterday.getTime()) {
      return `昨天 ${this.formatTime(date)}`;
    }

    // 如果是更早的时间，返回完整日期
    return `${date.getFullYear()}/${date.getMonth() + 1}/${date.getDate()} ${this.formatTime(date)}`;
  },
  // 格式化时间为 HH:mm
  formatTime(date) {
    const hours = String(date.getHours()).padStart(2, '0');
    const minutes = String(date.getMinutes()).padStart(2, '0');
    return `${hours}:${minutes}`;
  },

  // 统一未读计数管理
  updateUnreadCount() {
    // 更新全局未读数
    this.globalData.unreadCount = (this.globalData.unreadCount || 0) + 1;

    // 更新tabBar徽标
    wx.setTabBarBadge({
      index: 2,
      text: this.globalData.unreadCount > 99 ? '99+' : this.globalData.unreadCount.toString()
    });
  },

  // 消息弹窗
  showMessagePopup(chat, content) {

    // 清除之前的计时器（如果存在）
    if (this.globalData.popupTimeout) {
      clearTimeout(this.globalData.popupTimeout);
      this.globalData.popupTimeout = null;
    }

    this.globalData.popupMessage = {
      receiverId: chat.receiverId, // 添加关键字段
      avatar: chat.avatar || '/assets/default-avatar.png',
      name: chat.name || '未知用户',
      content: content,
      timestamp: Date.now()
    };

    this.globalData.showMessagePopup = true;
    this.notifyPages();

    // 振动反馈
    // wx.vibrateShort({
    //   type: 'light'
    // });
    // 播放提示音
    const audioContext = this.globalData.messageAudioContext;
    if (audioContext) {
      // 确保音频已加载，直接播放
      audioContext.play();
      // 如果需要循环播放，可以在 onEnded 时重新播放
      audioContext.onEnded(() => {
        // 可选：需要循环，可以重新播放
        // audioContext.play();
      });
    }

    // 重新设置新的计时器
    this.globalData.popupTimeout = setTimeout(() => {
      this.globalData.showMessagePopup = false;
      this.globalData.popupTimeout = null; // 清除定时器引用
      this.notifyPages();
    }, 3000);
  },


  // 增强通知方法
  notifyPages() {
    const pages = getCurrentPages();
    pages.forEach(page => {
      if (page.setData) {
        page.setData({
          gShowMessagePopup: this.globalData.showMessagePopup,
          gPopupMessage: this.globalData.popupMessage,
          messageList: this.globalData.chatList // 动态更新消息列表
        });
      }
    });
  },

  // 添加普通消息监听器
  addMessageListener(listener) {
    this.globalData.messageListeners.push(listener);
  },

  // 移除普通消息监听器
  removeMessageListener(listener) {
    this.globalData.messageListeners = this.globalData.messageListeners.filter(
      (l) => l !== listener
    );
  },

  // 添加系统消息监听器
  addSystemMessageListener(listener) {
    this.globalData.systemMessageListeners.push(listener);
  },

  // 移除系统消息监听器
  removeSystemMessageListener(listener) {
    this.globalData.systemMessageListeners = this.globalData.systemMessageListeners.filter(
      (l) => l !== listener
    );
  },
});